package main

import "fmt"

// 结构体
type dog struct {
	name  string
	color string
}

// 方法（作用于特定类型的函数）
// func (接收者) 方法名() {}
// 接收者表示调用该方法的具体类型变量，多用于类型名首字母小写表示，不推荐使用this
func (d dog) say() {
	fmt.Println(d.name, "汪汪汪")
}

// 构造函数
func newDog(name string, color string) dog {
	return dog{name, color}
}

// 值接收者 指针接收者
func (d dog) changeName() {
	d.name = "张三"
}
func (d *dog) changeColor() {
	d.color = "black"
}

func main() {
	var d = newDog("柴犬", "yellow")
	d.say()

	// 改变值类型
	d.changeName()
	fmt.Printf("d: %v\n", d) // d: {柴犬 yellow}
	d.changeColor()
	fmt.Printf("d: %v\n", d) // d: {柴犬 black}

}
